﻿using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using SuperStar.Models;
using System;
using Membership = System.Web.Security.Membership;

namespace SuperStar.Controllers
{
    [Authorize]
    public class CartController : Controller
    {
        private readonly BillModels _billModels = new BillModels();
        private readonly BillDetailModels _billDetailModels = new BillDetailModels();
        private readonly ResellerModels _resellerModels = new ResellerModels();
        private readonly ProductPromotionModels _productPromotionModels = new ProductPromotionModels();

        public ActionResult Index()
        {
            var membership = Membership.GetUser(User.Identity.Name);
            var bills = _billModels.GetBills((Guid)membership.ProviderUserKey);
            // Debugger role
            if(User.IsInRole("Debugger"))
            {
                var debugger = new Dictionary<String, String>
                               {
                                   {"0", "Bình thường"}, 
                                   {"1_error", "TH 01 Error - Demo lỗi Dealock với xóa sản phẩm khuyến mãi"}, 
                                   {"1_fix", "TH 01 Fix - Demo fix Dealock với xóa sản phẩm khuyến mãi"},
                                   {"2a_error", "TH 02a Error - Demo lỗi Dirty Read với thêm sản phẩm vào giỏ và hủy đơn hàng"},
                                   {"2b_error", "TH 02b Error - Demo lỗi Dirty Read với hủy đơn hàng và thêm sản phẩm vào giỏ"},
                                   {"2b_fix", "TH 02b Fix - Demo fix lỗi Dirty Read với hủy đơn hàng và thêm sản phẩm vào giỏ"},
                                   {"3_error", "TH 03 Error - Demo lỗi deadlock với hủy đơn hàng"},
                                   {"3_fix", "TH 03 Fix - Demo fix lỗi deadlock với hủy đơn hàng"},
                                   {"4a_error", "TH 04a Error - Demo lỗi Unrepeatable Read với thêm sản phẩm vào giỏ và hủy đơn hàng"},
                                   {"4b_error", "TH 04b Error - Demo lỗi Unrepeatable Read với hủy đơn hàng và thêm sản phẩm vào giỏ"},
                                   {"4a_fix", "TH 04a Fix - Demo fix lỗi Unrepeatable Read với thêm sản phẩm vào giỏ và hủy đơn hàng"},
                                   {"5_error", "TH 5 Error - Demo lỗi Dealock với thêm sản phẩm vào giỏ"},
                                   {"5_fix", "TH 5 Fix - Demo fix lỗi Dealock với thêm sản phẩm vào giỏ"},
                                   {"6_error", "TH 6 Error - Demo lỗi Dealock với thêm tặng phẩm vào giỏ"},
                                   {"6_fix", "TH 6 Fix - Demo fix lỗi Dealock với thêm tặng phẩm vào giỏ"}
                               };
                Debugger();
                ViewData["debugger"] = debugger;
            }
            if (bills.Count == 0)
            {
                // Thông báo giỏ hàng trống
                return View("NoProduct");
            }
            ViewData["resellers"] = _resellerModels.GetResellers();
            return View(bills);
        }

        public void Debugger()
        {
            if (Session["cart_debugger"] == null)
            {
                Session.Add("cart_debugger", "0");
            }
            if (Request.Params["debugger"] != null)
            {
                Session["cart_debugger"] = Request.Params["debugger"];
            }
            _billModels.DEBUGTYPE
                   = _billDetailModels.DEBUGTYPE
                   = _productPromotionModels.DEBUGTYPE
                   = _resellerModels.DEBUGTYPE
                   = Session["cart_debugger"].ToString();
        }


        /// <summary>
        /// Thêm sản phẩm vào giỏ
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public ActionResult AddToCart(int id)
        {
             Debugger();
             var membership = Membership.GetUser(User.Identity.Name);
            _billModels.AddToCart(id, (Guid) membership.ProviderUserKey);
            return RedirectToAction("Index");
        }
        /// <summary>
        /// Thay đổi đại lý nhận sản phẩm
        /// </summary>
        /// <param name="billId"></param>
        /// <param name="resellerId"></param>
        /// <returns></returns>
        public ActionResult ChangeReseller(int billId,int resellerId)
        {
            _billModels.ChangeReseller(billId, resellerId);
            return RedirectToAction("Index");
        }
        /// <summary>
        /// Hủy đơn đặt hàng
        /// </summary>
        /// <param name="billId"></param>
        /// <returns></returns>
        public ActionResult CancelBIll(int billId)
        {
            Debugger();
            _billModels.CancelBill(billId);
            return RedirectToAction("Index");
        }
        /// <summary>
        /// Lấy tặng phẩm khuyến mãi mà khách hàng chưa chọn
        /// </summary>
        /// <param name="billId"></param>
        /// <returns></returns>
        public JsonResult GetAvaildProductPromotions(int billId)
        {
            try
            {
                var productPromotions = _productPromotionModels.GetAvaidProductPromotions(billId).Select(p => new
                                                      {
                                                         Value = p.Id, // Giá trị trả về
                                                         DisplayText = p.Name // Giá trị hiển thị
                                                     });
                // Trả về đúng format gồm Result, Options cho jTable hiển thị                                    
                var result = new
                {
                    Result = "OK",
                    Options = productPromotions
                };
                return Json(result, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }
        /// <summary>
        /// Lấy chi tiết sản phẩm khuyến mãi
        /// </summary>
        /// <param name="promotionId"></param>
        /// <param name="billId"></param>
        /// <returns></returns>
        public ActionResult GetPromotionDetail(int promotionId, int billId)
        {
            try
            {
                var productPromotion = _productPromotionModels.GetProductPromotion(promotionId)
                    .Select(p => new
                    {
                        remainAmount = p.RemainAmount,
                        maxGiftAmount = p.MaxGiftAmount,
                        giftPointRequired = p.GiftPointRequired,
                        remainPoint = _billModels.GetRemainPointPromotion(billId)
                    });
                return Json(productPromotion, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }
        /// <summary>
        /// Lấy số điểm còn lại của 1 hóa đơn
        /// </summary>
        /// <param name="billId"></param>
        /// <returns></returns>
        public ActionResult GetPromotionRemainPoint(int billId)
        {
            try
            {
                return Json(_billModels.GetRemainPointPromotion(billId), JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }
        
        /// <summary>
        /// Lấy chi tiết hóa đơn (DS Sản phẩm khuyến mãi)
        /// </summary>
        /// <param name="billId"></param>
        /// <returns></returns>
        public ActionResult GetBillDetails(int billId)
        {
            try
            {
                var bill = _billModels.GetBill(billId);
                var billDetail = bill.BillDetails.Select(b => new
                               {
                                   id =b.Id,
                                   name = b.ProductPromotion.Name,
                                   promotionId = b.ProductPromotion.Id,
                                   remainAmount = b.ProductPromotion.RemainAmount,
                                   maxGiftAmount = b.ProductPromotion.MaxGiftAmount,
                                   giftPointRequired = b.ProductPromotion.GiftPointRequired,
                                   quantity = b.Quantity
                               });
                var result = new
                {
                    Result = "OK",
                    Records = billDetail
                };

                return Json(result, JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.Message });
            }
        }
        /// <summary>
        /// Cập nhật tặng phẩm khuyến mãi
        /// </summary>
        /// <param name="billId"></param>
        /// <param name="promotionId"></param>
        /// <param name="quantity"></param>
        /// <returns></returns>
        public ActionResult UpdateBillPromotionDetail(int billId, int promotionId, int quantity)
        {
            object result;
            try
            {
                String message;
                if (_billDetailModels.Update(billId, promotionId, quantity, out message))
                    result = new { Result = "OK" };
                else
                    result = new { Result = "ERROR", Message = "Có lỗi trong quá trình cập nhật: <br/>" + message };

            }
            catch (Exception ex)
            {
                result = new { Result = "ERROR", Message = ex.Message + ex.InnerException };
            }
            return Json(result, JsonRequestBehavior.AllowGet);
        }
        /// <summary>
        /// Thêm tặng phẩm khuyến mãi
        /// </summary>
        /// <param name="billId"></param>
        /// <param name="productPromotion"></param>
        /// <param name="quantity"></param>
        /// <returns></returns>
        public ActionResult CreateBillDetail(int billId, int productPromotion, int quantity)
        {
            Debugger();
            object result;
            try
            {
                string message;
                var billDetail = _billDetailModels.Insert(billId, productPromotion, quantity, out message);

                if (billDetail != null)
                {
                    var record = new
                    {
                        id = billDetail.Id,
                        name = billDetail.ProductPromotion.Name,
                        promotionId = billDetail.ProductPromotion.Id,
                        remainAmount = billDetail.ProductPromotion.RemainAmount,
                        maxGiftAmount = billDetail.ProductPromotion.MaxGiftAmount,
                        giftPointRequired = billDetail.ProductPromotion.GiftPointRequired,
                        quantity = billDetail.Quantity
                    };
                    result = new { Result = "OK", Record = record };
                }
                else
                    result = new { Result = "ERROR", Message = "Có lỗi trong quá trình thêm:<br/>" + message };

            }
            catch (Exception ex)
            {
                result = new { Result = "ERROR", Message = ex.Message + ex.InnerException.Message };
            }
            return Json(result, JsonRequestBehavior.AllowGet);
        }
        /// <summary>
        /// Xóa tặng phẩm khuyến mãi
        /// </summary>
        /// <param name="billId"></param>
        /// <param name="promotionId"></param>
        /// <returns></returns>
        public JsonResult DeleteBillDetail(int billId, int promotionId)
        {
            try
            {
                Debugger();
                if(_billDetailModels.Delete(billId,promotionId))
                {
                    return Json(new { Result = "OK" });
                }
                return Json(new { Result = "ERROR", Message = "Có lỗi trong quá trình xóa!"});
            }
            catch (Exception ex)
            {
                return Json(new { Result = "ERROR", Message = ex.InnerException.Message });
            }
        }
    }
}
